//
// a dynamic array
//

#ifndef DARRAY_H
#define DARRAY_H

//
struct DArray;
typedef struct DArray *darray;

// call back function
// return 1 if success on doing something
// return 0 if failed on doing something
typedef int (*DoSomeThingCB)(void *data, void *context);

//
// call back function for debug
//
typedef void (*PrintCB)(void *value);

//
// create a dynamic array
//
darray da_create(void);

//
// destroy a dynamic array
// da: beginning of dynamic array
//
void da_destroy(darray da);

//
// add a new value at a specified index
// of dynamic array node
//
void *da_add(darray da, int index, void *value);

//
// remove value at a specified index
// of dynamic array node
//
void *da_remove(darray da, int index);

//
// return value at a specified node
//
void *da_get_value(darray da, int index);

//
// print all values in double list
//
void da_print(darray da, PrintCB cb);

//
// change size
//
void da_change_size(darray da, int newsize);

//
// traverse each node in dynamic array
// do something(callback) for each node
// return 0 if error happened
// return 1 if done successfully
//
int da_foreach(darray da, DoSomeThingCB cb, void *ctx);

#endif // DARRAY_H
